package main

import (
	"errors"
	"fmt"
)

// defer + recover + panic
// defer：延缓执行
// recover：捕获异常
// panic：抛出异常
//
// 自定义错误 errors.New("读取错误")
// errors.New("读取错误")
func main() {
	//
	testPrintError0()
	testThrowError0()
	//testDefineError0()

}

// 测试自定义错误，使用panic抛出错误 ,自定义错误 errors.New("读取错误")
func testDefineError0() {
	msg, err := defineError("conf.ini7")
	if err != nil {
		panic(err)
	} else {
		fmt.Println("msg=", msg)
	}
	fmt.Println("代码继续执行~go on")
}

// 发生异常不抛出，只打印异常 ，go on 会继续执行
func testPrintError0() {
	printError()
	fmt.Println("代码继续执行~go on")
}

// 发生异常不抛出，只打印异常
func printError() {
	//使用defer + recover
	defer func() {
		err := recover()
		if err != nil {
			fmt.Println("方法执行出错了~err=", err)
		}
	}()

	// 可能会引起异常的代码
	var slice []int
	var res int = slice[0]
	fmt.Println(res)
}

// 发生异常就抛出,不会执行go on
func testThrowError0() {
	throwError()
	fmt.Println("代码继续执行~go on")
}

// 发生异常就抛出
func throwError() {
	defer func() {
		err := recover()
		if err != nil {
			panic(err)
		}
	}()
	// 可能会引起异常的代码
	var slice []int
	var res int = slice[0]
	fmt.Println(res)
}

// 自定义错误 errors.New("读取错误")
func defineError(name string) (msg string, err error) {
	if name == "conf.ini" {
		return "success", nil
	} else {
		return "error", errors.New("读取错误")
	}

}
